在前兩天的文章中,我們探討了 Transformer 模型的運作原理及 Tokenizer 如何將自然語言轉換成模型能夠理解的數字。今天,我們將進一步介紹嵌入(Embeddings),它更進一步將 tensor 轉換為具有語義訊息的向量(Vectors),並讓模型能夠捕捉到詞語之間的關係。
在開發過程中,尤其是 RAG 服務的開發上,會影響到最重要的向量搜索功能,而文末也會呈現 hugging face 上,評估表現最好的三個繁體中文 embedding model,及各自在不同任務所獲取的分數,在開發過程中便可以參考這些指標作為模型選擇的依據。
常見的嵌入技術包括 Word2Vec、GloVe 以及更進階的 BERT 和 GPT 等模型。這些技術從靜態詞嵌入逐步發展為能夠捕捉上下文的動態嵌入。
傳統技術如 Word2Vec 和 GloVe 為上下文無關模型,通過詞語共現來生成固定維度的向量,能夠捕捉詞語之間的基本語義關聯。例如,通過 Word2Vec 的詞嵌入,我們能夠發現「king - man + woman ≈ queen」,展示出詞語之間的線性語義關係。
隨著技術發展,基於 Transformer 架構的模型如 BERT 和 GPT 引入了動態詞嵌入的概念,這些模型能夠根據詞語在句子中的上下文生成詞嵌入,如 BERT 同時考慮了詞語的左側和右側上下文,而 GPT 則主要使用輸入的左側上下文來生成後續的詞語。透過這樣的技術,不僅能夠讓讓模型理解單個詞的靜態語義,還能捕捉到同一詞語在不同語境中的細微變化。
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
sentence1 = "We are in the bank."
sentence2 = "We stay near the bank."
inputs1 = tokenizer(sentence1, return_tensors="pt")
inputs2 = tokenizer(sentence2, return_tensors="pt")
with torch.no_grad():
outputs1 = model(**inputs1)
outputs2 = model(**inputs2)
bank_embedding1 = outputs1.last_hidden_state[0, 5, :]
bank_embedding2 = outputs2.last_hidden_state[0, 5, :]
# 可以用這兩行語法看到 embedding 後的 vector,這裡就不呈現了
print("Sentence 1 - 'bank' embedding:", bank_embedding1)
print("Sentence 2 - 'bank' embedding:", bank_embedding2)
cosine_similarity = torch.nn.functional.cosine_similarity(bank_embedding1, bank_embedding2, dim=0)
print(cosine_similarity.item())
''' output: 0.688329815864563 '''
可以看出兩個 bank 不是等價的,並且兩個的相似程度並不高。
我們從 Hugging face 大型文本嵌入模型 (Massive Text Embedding Benchmark, MTEB) 的排行榜 上抓出繁體中文平均表現最佳的三個模型:
Model | Model Size | Memory Usage | Embedding Dimensions | Max Tokens |
---|---|---|---|---|
Conan-embedding-v1 | 326 | 1.21 | 1792 | 512 |
xiaobu-embedding-v2 | 326 | 1.21 | 1792 | 512 |
gte-Qwen2-7B-instruct | 7613 | 28.36 | 3584 | 131072 |
Model | Average | CLS | Clustering | Reranking | Retrieval | STS | Pair_CLS |
---|---|---|---|---|---|---|---|
Conan-embedding-v1 | 72.62 | 75.03 | 66.33 | 72.76 | 76.67 | 64.18 | 91.66 |
xiaobu-embedding-v2 | 72.43 | 74.67 | 65.17 | 72.58 | 76.5 | 64.53 | 91.87 |
gte-Qwen2-7B-instruct | 72.05 | 75.09 | 66.06 | 68.92 | 76.03 | 65.33 | 87.48 |
ref.